JSP로 DB 데이터 CRUD 실행

✒️ 2025-05-26 10:49 내용 수정



사전 준비

  1. 오라클과 연동#사전 준비의 내용대로 진행한다.
  2. 작업 표시줄의 검색에서 Start database를 입력해 실행창을 열고 sqlplus 계정명/비밀번호를 입력해 실습에 사용할 계정으로 접속한다.
  3. 접속 후 시퀀스, 테이블, view를 생성하고 샘플 데이터를 추가한 후 commit 해준다.
-- SQEUNCE 생성
CREATE SEQUENCE SEQ_STD_NO;

-- 성적 테이블 생성
CREATE TABLE STD_SCORE (
	NO INT PRIMARY KEY,
	NAME VARCHAR2(100) NOT NULL,
	KOR NUMBER(3) NOT NULL,
	ENG NUMBER(3) NOT NULL,
	MATH NUMBER(3) NOT NULL
);

-- 샘플 데이터 추가
INSERT INTO STD_SCORE VALUES(SEQ_STD_NO.nextVal, '홍길동', 50, 80, 93);
INSERT INTO STD_SCORE VALUES(SEQ_STD_NO.nextVal, '고길동', 100, 90, 87);
INSERT INTO STD_SCORE VALUES(SEQ_STD_NO.nextVal, '김길동', 80, 60, 47);

-- VIEW 추가
CREATE VIEW STD_VIEW AS (
	SELECT S.*, (KOR+ENG+MATH) TOTAL, ROUND((KOR+ENG+MATH)/3, 1) AVG, RANK() OVER(ORDER BY (KOR+ENG+MATH) DESC) RANK FROM STD_SCORE S
);

-- commitsele
COMMIT;

crud 1.png
crud 2.png
crud 3.png


데이터 조회

1. DB 연결 클래스 생성

package DAO;

import java.sql.Connection;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBConnection {

	static DBConnection db = null;
	DataSource ds;

	// singleton pattern으로 생성
	public static DBConnection getInstance() {
		if(db == null) {
			db = new DBConnection();
		}
		return db;
	}

	// 생성자에서 Context 객체와 DataSource 초기화
	public DBConnection() {
		try {
			InitialContext ic = new InitialContext();
			Context ctx = (Context)ic.lookup("java:comp/env");
			ds = (DataSource)ctx.lookup("jdbc/oracle_test");
		
		} catch (NamingException e) {
			e.printStackTrace();
		}
	}

	// 생성자에서 준비한 정보로 DB에 연결하여 Connection 객체 얻기
	public Connection getConnection() {
		Connection connec = null;
		try {
			connec = ds.getConnection();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return connec;
	}
}

2. DTO 클래스 생성

package DTO;

public class STDScoreDTO {
	private int no;
	private String name;
	private int kor;
	private int eng;
	private int math;
	private int total;
	private int rank;
	private float avg;
	
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getKor() {
		return kor;
	}
	public void setKor(int kor) {
		this.kor = kor;
	}
	public int getEng() {
		return eng;
	}
	public void setEng(int eng) {
		this.eng = eng;
	}
	public int getMath() {
		return math;
	}
	public void setMath(int math) {
		this.math = math;
	}
	public int getTotal() {
		return total;
	}
	public void setTotal(int total) {
		this.total = total;
	}
	public int getRank() {
		return rank;
	}
	public void setRank(int rank) {
		this.rank = rank;
	}
	public float getAvg() {
		return avg;
	}
	public void setAvg(float avg) {
		this.avg = avg;
	}
}

3. DAO 클래스 생성

package DAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import DTO.STDScoreDTO;

public class STDScoreDAO {
	
	public static STDScoreDAO dao;
	
	public static STDScoreDAO getInstance() {
		if(dao == null) {
			dao = new STDScoreDAO();
		}
		return dao;
	}
	
	// 데이터베이스와 연결하여 내용 조회
	public List<STDScoreDTO> selectList() {
		List<STDScoreDTO> list = new ArrayList<>();
		Connection connec = null;
		PreparedStatement prestat = null;
		ResultSet rs = null;
		String sql = "SELECT * FROM STD_VIEW";
		
		try {
			// 1. Connection 얻어오기
			connec = DBConnection.getInstance().getConnection();
		
			// 2. sql문 얻어오기
			prestat = connec.prepareStatement(sql);
			
			// 3. sql문 시행 겨로가 처리 객체 얻어오기
			rs = prestat.executeQuery();
			
			// 4. STDScoreDTO 필드에 속성을 저장하고 List에 저장하기
			while(rs.next()) {
				STDScoreDTO dto = new STDScoreDTO();
				
				dto.setNo(rs.getInt("no"));
				dto.setName(rs.getString("name"));
				dto.setKor(rs.getInt("kor"));
				dto.setEng(rs.getInt("eng"));
				dto.setMath(rs.getInt("math"));
				dto.setTotal(rs.getInt("total"));
				dto.setAvg(rs.getFloat("avg"));
				dto.setRank(rs.getInt("rank"));
				
				list.add(dto);
			}
		} catch (Exception e) {
			e.printStackTrace(); 
		} finally {
			try {
				if (rs != null) {
					rs.close();
				}
				if (prestat != null) {
					prestat.close();
				}
				if (connec != null) {
					connec.close();
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}
		
		return list;
	}
}

4. 성적 확인용 JSP 생성

<%@page import="DTO.STDScoreDTO"%>
<%@page import="java.util.List"%>
<%@page import="DAO.STDScoreDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	STDScoreDAO dao = STDScoreDAO.getInstance();
	
	List<STDScoreDTO> list = dao.selectList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
	<style>
		table{border: 1px solid black;
			  border-collapse: collapse;
			  text-align:center;}
		th{width:80px;}
	</style>
</head>
<body>
	<table border="1">
		<caption>==학생정보==</caption>
		<tr>
			<th>번호</th>
			<th>이름</th>
			<th>국어</th>
			<th>영어</th>
			<th>수학</th>
			<th>총합</th>
			<th>평균</th>
			<th>순위</th>
			<th>비고</th>
		</tr>
		
		<%
				for(int i = 0; i < list.size(); i++) {
					STDScoreDTO dto = list.get(i);
			%>
			<tr>
				<td> <%= dto.getNo() %> </td>
				<td> <%= dto.getName() %> </td>
				<td> <%= dto.getKor() %> </td>
				<td> <%= dto.getEng() %> </td>
				<td> <%= dto.getMath() %> </td>
				<td> <%= dto.getTotal() %> </td>
				<td> <%= dto.getAvg() %> </td>
				<td> <%= dto.getRank() %> </td>
				<td><input type="button" value="삭제"></td>
			</tr>
		<% } %>
		<tr>
			<td colspan="9" align="center">
				<input type="button" value="학생정보 추가하기" onclick="location.href='std_register.jsp'">
			</td>
		</tr>
	</table>
</body>
</html>

crud 4.png


데이터 추가

1. 학생 등록용 JSP 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
	<script>
		function send(f) {
			var name = f.name.value.trim();
			var kor = f.kor.value.trim();
			var eng = f.eng.value.trim();
			var math = f.math.value.trim();
			
			// 유효성 체크 - form.submit()을 그냥 하면 유효성 체크가 없이 전달됨
			if (name == '') {
				alert("이름을 입력해주세요.");
				return;
			}
			
			var num = /^[0-9]{1,3}$/; // 정규 표현식으로 3자리 숫자 판별
			if (!num.test(kor) || kor < 0 || kor > 100
				|| !num.test(eng) || eng < 0 || eng > 100
				|| !num.test(math) || math < 0 || math > 100) 
			{
				alert("3 자리 이하의 정수만 입력해주세요.");
				return;
			}			
			// form 제출
			f.action = "register.jsp";
			f.submit();
		}
	</script>
</head>
<body>
	<form>
		<table>
			<caption>학생 정보를 입력하세요</caption>
			<tr>
				<td>이름</td>
				<td><input type="text" name="name"></td>
			</tr>
			<tr>
				<td>국어성적</td>
				<td><input type="text" name="kor"></td>
			</tr>
			<tr>
				<td>영어성적</td>
				<td><input type="text" name="eng"></td>
			</tr>
			<tr>
				<td>수학성적</td>
				<td><input type="text" name="math"></td>
			</tr>
			<tr>
				<td colspan="2">
					<input type="button" value="등록" onclick="send(this.form)">
					<input type="button" value="취소" onclick="location.href='student_score.jsp'">
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

2. 정보 전달용 JSP 생성

<%@page import="DAO.STDScoreDAO"%>
<%@page import="DTO.STDScoreDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// std_register.jsp에서 전달받은 정보
	String name = request.getParameter("name");
	int kor = Integer.parseInt(request.getParameter("kor"));
	int eng = Integer.parseInt(request.getParameter("eng"));
	int math = Integer.parseInt(request.getParameter("math"));
	
	// STDScoreDTO 객체에 정보 저장
	STDScoreDTO dto = new STDScoreDTO();
	
	dto.setName(name);
	dto.setKor(kor);
	dto.setEng(eng);
	dto.setMath(math);
	
	// STDScoreDAO 객체를 호출해서 STDScoreDTO 객체 정보를 DB에 전달
	int result = STDScoreDAO.getInstance().insert(dto);

	// DB에 전달이 성공적으로 이루어졌다면 다시 학생 성적 화면으로 복귀
	if(result == 1) {
		response.sendRedirect("student_score.jsp");
	}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

3. DAO 수정

// public List<STDScoreDTO> selectList() 메소드 아래에 insert 메소드 추가
// 학생의 성적 추가
public int insert(STDScoreDTO dto) {
	int result = 0;
	
	Connection connec = null;
	PreparedStatement prestat = null;
	
	String sql = "INSERT INTO STD_SCORE VALUES(SEQ_STD_NO.nextVal, ?, ?, ?, ?)";
	
	try {
		// 1. Connection 얻어오기
		connec = DBConnection.getInstance().getConnection();
	
		// 2. 명령 처리 객체 획득
		prestat = connec.prepareStatement(sql);
		
		// 3. prestat으로 sql문의 빈 자리 채우기
		prestat.setString(1,  dto.getName());
		prestat.setInt(2, dto.getKor());
		prestat.setInt(3, dto.getEng());
		prestat.setInt(4, dto.getMath());
		
		// 4. DB에 데이터 전송(result = 처리된 행의 수)
		result = prestat.executeUpdate();
		} catch (Exception e) {
		e.printStackTrace(); 
	} finally {
		try {
			if (prestat != null) {
				prestat.close();
			}
			if (connec != null) {
				connec.close();
			}
		} catch (Exception e2) {
			e2.printStackTrace();
		}
	}
	
	return result;
}

4. 데이터 추가 테스트


데이터 삭제

1. 성적 확인용 JSP 수정

<%@page import="DTO.STDScoreDTO"%>
<%@page import="java.util.List"%>
<%@page import="DAO.STDScoreDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	STDScoreDAO dao = STDScoreDAO.getInstance();
	
	List<STDScoreDTO> list = dao.selectList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
	<style>
		table{border: 1px solid black;
			  border-collapse: collapse;
			  text-align:center;}
		th{width:80px;}
	</style>
	<script>
		function del(no) {
			// 삭제 재확인
			if(confirm("정말 삭제하시겠습니까?") == false) {
				return; // 삭제 취소
			}
			
			location.href = 'std_del.jps?no='+no;			
		}
	</script>
</head>
<body>
	<table border="1">
		<caption>==학생정보==</caption>
		<tr>
			<th>번호</th>
			<th>이름</th>
			<th>국어</th>
			<th>영어</th>
			<th>수학</th>
			<th>총합</th>
			<th>평균</th>
			<th>순위</th>
			<th>비고</th>
		</tr>
		
		<% 
			for(int i = 0; i < list.size(); i++) { 
				STDScoreDTO dto = list.get(i); 
		%>
			<tr>
				<td> <%= dto.getNo() %> </td>
				<td> <%= dto.getName() %> </td>
				<td> <%= dto.getKor() %> </td>
				<td> <%= dto.getEng() %> </td>
				<td> <%= dto.getMath() %> </td>
				<td> <%= dto.getTotal() %> </td>
				<td> <%= dto.getAvg() %> </td>
				<td> <%= dto.getRank() %> </td>
				<td><input type="button" value="삭제" onclick="del('<%= dto.getNo()%>')"></td>
			</tr>
		<% } %>
		<tr>
			<td colspan="9" align="center">
				<input type="button" value="학생정보 추가하기" onclick="location.href='std_register.jsp'">
			</td>
		</tr>
	</table>
</body>
</html>

2. 삭제용 JSP 생성

<%@page import="DAO.STDScoreDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	// 인코딩 처리
	request.setCharacterEncoding("utf-8");

	// student_score.jsp에서 보낸 삭제 요청
	int no = Integer.parseInt(request.getParameter("no"));
	
	// DB에서 값을 제어
	int result = STDScoreDAO.getInstance().delete(no);
	
	if (result > 0) {
		response.sendRedirect("student_score.jsp");
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	오류가 발생했습니다.
</body>
</html>

3. DAO 수정

// public int insert() 메소드 아래에 delete() 메소드 추가
public int delete(int no) {
	int result = 0;
	
	Connection connec = null;
	PreparedStatement prestat = null;
	
	String sql = "DELETE FROM STD_SCORE WHERE NO =?";
	
	try {
		// 1. Connection 얻어오기
		connec = DBConnection.getInstance().getConnection();
	
		// 2. 명령 처리 객체 획득
		prestat = connec.prepareStatement(sql);
		
		// 3. prestat으로 sql문의 빈 자리 채우기
		prestat.setInt(1, no);
		
		// 4. DB에 제거할 데이터 정보 전송 및 데이터 제거
		result = prestat.executeUpdate();
		} catch (Exception e) {
		e.printStackTrace(); 
	} finally {
		try {
			if (prestat != null) {
				prestat.close();
			}
			if (connec != null) {
				connec.close();
			}
		} catch (Exception e2) {
			e2.printStackTrace();
		}
	}
	
	return result;
}

데이터 수정

1. 성적 확인용 JSP 수정

<%@page import="DTO.STDScoreDTO"%>
<%@page import="java.util.List"%>
<%@page import="DAO.STDScoreDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	STDScoreDAO dao = STDScoreDAO.getInstance();
	
	List<STDScoreDTO> list = dao.selectList();
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
	<style>
		table{border: 1px solid black;
			  border-collapse: collapse;
			  text-align:center;}
		th{width:80px;}
	</style>
	<script>
		function del(no) {
			// 삭제 재확인
			if(confirm("정말 삭제하시겠습니까?") == false) {
				return; // 삭제 취소
			}
			
			location.href = 'std_del.jsp?no='+no;			
		}
		
		function modify(no, name, kor, eng, math) {
			location.href = 'std_update.jsp?no='+no+'&name='+name+'&kor='+kor+'&eng='+eng+'&math='+math;
		}
	</script>
</head>
<body>
	<table border="1">
		<caption>==학생정보==</caption>
		<tr>
			<th>번호</th>
			<th>이름</th>
			<th>국어</th>
			<th>영어</th>
			<th>수학</th>
			<th>총합</th>
			<th>평균</th>
			<th>순위</th>
			<th>비고</th>
		</tr>
		
		<% 
			for(int i = 0; i < list.size(); i++) { 
				STDScoreDTO dto = list.get(i); 
		%>
			<tr>
				<td> <%= dto.getNo() %> </td>
				<td> <%= dto.getName() %> </td>
				<td> <%= dto.getKor() %> </td>
				<td> <%= dto.getEng() %> </td>
				<td> <%= dto.getMath() %> </td>
				<td> <%= dto.getTotal() %> </td>
				<td> <%= dto.getAvg() %> </td>
				<td> <%= dto.getRank() %> </td>
				<td>
					<input type="button" value="수정" onclick="modify('<%= dto.getNo() %>',
																	 '<%= dto.getName() %>',
																	 '<%= dto.getKor() %>',
																	 '<%= dto.getEng() %>',
																	 '<%= dto.getMath() %>')">
					<input type="button" value="삭제" onclick="del('<%= dto.getNo()%>')">
				</td>
			</tr>
		<% } %>
		<tr>
			<td colspan="9" align="center">
				<input type="button" value="학생정보 추가하기" onclick="location.href='std_register.jsp'">
			</td>
		</tr>
	</table>
</body>
</html>

2. 수정 화면 JSP 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String name = request.getParameter("name");
	int no = Integer.parseInt(request.getParameter("no"));
	int kor = Integer.parseInt(request.getParameter("kor"));
	int eng = Integer.parseInt(request.getParameter("eng"));
	int math = Integer.parseInt(request.getParameter("math"));
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
	<script>
		function update(f) {
			var no = f.no.value.trim();
			var name = f.name.value.trim();
			var kor = f.kor.value.trim();
			var eng = f.eng.value.trim();
			var math = f.math.value.trim();
			
			// 유효성 검사
			if(name == '') {
				alert("이름을 입력해주세요.");
				return;
			}
			
			if(kor == '') {
				alert("점수를 입력해주세요");
				return;
			}
			
			if(eng == '') {
				alert("점수를 입력해주세요");
				return;
			}
			
			if(math == '') {
				alert("점수를 입력해주세요");
				return;
			}
			
			var num = /^[0-9]{1,3}$/;
			if (!num.test(kor) || kor < 0 || kor > 100
				|| !num.test(eng) || eng < 0 || eng > 100
				|| !num.test(math) || math < 0 || math > 100) 
			{
				alert("3 자리 이하의 정수만 입력해주세요.");
				return;
			}

			f.action = "std_modify.jsp";
			f.submit();
		}
	</script>
</head>
<body>
	<form>
		<input type="hidden" name="no" value="<%= no %>">
		<table border="1">
			<caption>학생정보 수정</caption>
			<tr>
				<th>이름</th>
				<td><input name="name" value="<%= name %>"></td>
			<tr>
			<tr>
				<th>국어</th>
				<td><input name="kor" value="<%= kor %>"></td>
			<tr>
			<tr>
				<th>영어</th>
				<td><input name="eng" value="<%= eng %>"></td>
			<tr>
			<tr>
				<th>수학</th>
				<td><input name="math" value="<%= math %>"></td>
			<tr>
			<tr>
				<td colspan="2">
					<input type="button" value="수정" onclick="update(this.form)">
					<input type="button" value="취소" onclick="location.href='student_score.jsp'">
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

3. 수정 내용 전달 JSP 생성

<%@page import="DAO.STDScoreDAO"%>
<%@page import="DTO.STDScoreDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	request.setCharacterEncoding("utf-8");

	String name = request.getParameter("name");
	
	int no = Integer.parseInt(request.getParameter("no"));
	int kor = Integer.parseInt(request.getParameter("kor"));
	int eng = Integer.parseInt(request.getParameter("eng"));
	int math = Integer.parseInt(request.getParameter("math"));
	
	// STDScoreDTO 객체에 정보 저장
	STDScoreDTO dto = new STDScoreDTO();
	
	dto.setNo(no);
	dto.setName(name);
	dto.setKor(kor);
	dto.setEng(eng);
	dto.setMath(math);
	
	// STDScoreDAO 객체를 호출해서 STDScoreDTO 객체 정보를 DB에 전달
	int result = STDScoreDAO.getInstance().update(dto);
	
	if(result > 0) {
		response.sendRedirect("student_score.jsp");
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

4. DAO 수정

// public int delete() 메소드 아래에 update() 메소드 추가
public int update(STDScoreDTO dto) {
	int result = 0;
	
	Connection connec = null;
	PreparedStatement prestat = null;
	
	String sql = "UPDATE STD_SCORE SET NAME=?,KOR=?,ENG=?,MATH=? WHERE NO=?";
	
	try {
		// 1. Connection 얻어오기
		connec = DBConnection.getInstance().getConnection();
	
		// 2. 명령 처리 객체 획득
		prestat = connec.prepareStatement(sql);
		
		// 3. prestat으로 sql문의 빈 자리 채우기
		prestat.setString(1,  dto.getName());
		prestat.setInt(2, dto.getKor());
		prestat.setInt(3, dto.getEng());
		prestat.setInt(4, dto.getMath());
		prestat.setInt(5, dto.getNo());
		
		// 4. DB에 데이터 전송(result = 처리된 행의 수)
		result = prestat.executeUpdate();
		} catch (Exception e) {
		e.printStackTrace(); 
	} finally {
		try {
			if (prestat != null) {
				prestat.close();
			}
			if (connec != null) {
				connec.close();
			}
		} catch (Exception e2) {
			e2.printStackTrace();
		}
	}
	
	return result;
}

데이터 수정 테스트